home *** CD-ROM | disk | FTP | other *** search
/ Gekikoh Dennoh Club 1 / Gekikoh Dennoh Club Vol. 1 (Japan).7z / Gekikoh Dennoh Club Vol. 1 (Japan) (Track 1).bin / tools / dcview / src / dcfile.c < prev    next >
Encoding:
C/C++ Source or Header  |  1997-05-23  |  14.6 KB  |  595 lines

  1. /******************************************************************************
  2.  *    DCfile.c:    ファイル読み込み処理
  3.  ******************************************************************************
  4.  *
  5.  *
  6.  */
  7. #include <sxdef2.h>
  8. #include <stdio.h>
  9. #include <jfctype.h>
  10. #include <stdlib.h>
  11. #include <string.h>
  12. #include <io.h>
  13. #include <jfctype.h>
  14. #include <doslib.h>
  15. #include <event.h>        /* イベントマンを利用するときに必要    */
  16. #include <sxgraph.h>        /* グラフ系マネージャを利用するときに必要 */
  17. #include <window.h>        /* ウィンドウマンを利用するときに必要    */
  18. #include <control.h>        /* コントロールマンを利用するときに必要    */
  19. #include <dialog.h>        /* ダイアログマンを利用するときに必要    */
  20. #include <task.h>        /* タスクマンを利用するときに必要    */
  21. #include "DC.h"            /* このプログラム固有のヘッダファイル    */
  22.  
  23. /******************************************************************************
  24.  *    GetData():    データ読み込み
  25.  ******************************************************************************
  26.  *    引数:    ComVal *pcv    共通変数へのポインタ
  27.  *        char *pname    ファイル名(フルパス)
  28.  */
  29. int GetData(ComVal *pcv, char *pname)
  30. {
  31.     FILE *fn;
  32.     int i,cutOk,cache_flag=0;
  33.     long fileLen, line;
  34.     char **data;
  35.     void **dmy1;
  36.  
  37.     Graph *lastGraph;
  38.     Dialog *dialogPtr;
  39.     int lastBC;
  40.  
  41.     int cut;
  42.     char *Pt;
  43.  
  44.     fn = fopen(pname, "rb");
  45.     if (fn == NULL) {
  46.         pcv->errorCode = -2;
  47.         DMError(D_CONFIRM,pname);
  48.         DMError(D_CONFIRM,"ファイルが見つかりません");
  49.         return(0);
  50.     }
  51.  
  52.     fseek(fn, 0L, SEEK_END);
  53.     fileLen = ftell(fn);        /* ファイルサイズを求める    */
  54.     fseek(fn, 0L, SEEK_SET);
  55.  
  56.     dmy1 = NULL;
  57.     dmy1 = MMChHdlNew((fileLen*3)/2 + 1024 + 1);
  58.  
  59.     if (dmy1 == NULL) {        /* メモリが確保できる?        */
  60.         DMError(D_CONFIRM | D_RED, "メモリが確保できません");
  61.         fclose(fn);
  62.         return(0);
  63.     }
  64.     MMHdlDispose(dmy1);
  65.  
  66.  
  67.     EMEnCross();        /* マウスポインタアニメーション開始    */
  68.  
  69.     if (pcv->loadFlag)
  70.         GMDisposeRgn(pcv->updateRgnHdl);
  71.     pcv->updateRgnHdl = GMNewRgn();
  72.  
  73. /* 97.04.29 */
  74.     /* テキストメモリ確保    */
  75.     line = fileLen / 2;
  76.     if (pcv->fcache) {
  77.         if (pcv->fcache_d[pcv->depth] < 0) {
  78.  
  79.             pcv->txt_cache[pcv->depth] = MMChHdlNew(fileLen + 32);
  80.             pcv->txtNo_cache[pcv->depth] = MMChHdlNew(line + 1024);    /* 行ポインタ確保    */
  81.  
  82.             MMHdlLock(pcv->txt_cache[pcv->depth]);
  83.             fread(*(pcv->txt_cache[pcv->depth]), sizeof(char), (size_t) (fileLen), fn);
  84.             MMHdlUnlock(pcv->txt_cache[pcv->depth]);
  85.             pcv->fcache_d[pcv->depth] = 1;
  86.             cache_flag = 0;
  87.         } else {
  88.             if (pcv->loadFlag && (pcv->depth > 0)) {
  89.                 MMHdlDispose(pcv->txt_cache[pcv->depth]);
  90.                 MMHdlDispose(pcv->txtNo_cache[pcv->depth]);
  91.             }
  92.             pcv->fcache_d[pcv->depth] = -1;
  93.             pcv->depth--;
  94.             cache_flag = 1;
  95.         }
  96.         pcv->txt = pcv->txt_cache[pcv->depth];
  97.         pcv->txtNo = pcv->txtNo_cache[pcv->depth];
  98.         pcv->depth++;
  99.     } else {
  100.         if (pcv->loadFlag) {
  101.             MMHdlDispose(pcv->txt);
  102.             MMHdlDispose(pcv->txtNo);
  103.         }
  104.  
  105.         pcv->txt = MMChHdlNew(fileLen + 32);
  106.         pcv->txtNo = MMChHdlNew(line + 1024);    /* 行ポインタ確保    */
  107.  
  108.         MMHdlLock(pcv->txt);
  109.         fread(*(pcv->txt), sizeof(char), (size_t) (fileLen), fn);
  110.         MMHdlUnlock(pcv->txt);
  111.         dispoBits(pcv);
  112.         cache_flag = 0;
  113.     }
  114.  
  115.     fclose(fn);
  116.  
  117.     pcv->loadFlag = 1;
  118.     pcv->file_size = fileLen;
  119.     pcv->status = 0;
  120.     strcpy(pcv->currentFname, pname);
  121.     chkdrv(pcv);            /* ドライブパスのチェック    */
  122.     setWinOpt(pcv, fileLen);    /* ウィンドウオプション設定    */
  123.  
  124.     MMHdlLock(pcv->txt);
  125.     Pt = *pcv->txt;
  126.     cut = 0;
  127.     for(i=0;i<fileLen;i++) {
  128.         if (!strncmp(Pt++, "%CUT:", 5))
  129.             cut++;
  130.     }
  131.  
  132.     MMHdlUnlock(pcv->txt);
  133.     dialogPtr = NULL;
  134.     if ((fileLen > 20480 || cut > 1) && !cache_flag) /* プログレスバーの表示    */
  135.         dialogPtr = TSReferDM(133, NULL, W_FRONT);
  136.     if (dialogPtr == NULL)        /* 作成できなかった        */
  137.         pcv->pgb = 0;
  138.     else
  139.         pcv->pgb = 1;
  140.  
  141.     if (pcv->pgb) {
  142.         /* ダイアログ内を描画する */
  143.         GMSetGraph(&pcv->windowPtr->graph); /* 自分をカレントグラフにする */
  144.         WMMove(&dialogPtr->window,
  145.             GMLocalToGlobal(LONGWORD(pcv->fontS[pcv->font] * 97 / 4 - 130,
  146.                 pcv->fontS[pcv->font] * 30 / 2 - 45)), FALSE);
  147.         WMShow(&dialogPtr->window);
  148.         lastGraph = GMGetGraph();    /* カレントグラフを退避する    */
  149.         /* ダイアログをカレントグラフにする */
  150.         GMSetGraph(&dialogPtr->window.graph);
  151.         /* タイトルを描画する */
  152.         GMShadowStrZ("しばらくお待ち下さい", LONGWORD(70, 24));
  153.         lastBC = GMBackColor(G_LGRAY);    /* バックグラウンドカラーを明灰にする */
  154.         DMDraw(dialogPtr);        /* すべてのアイテムを描画する    */
  155.     }
  156.  
  157.     pcv->cutNo[pcv->depth] = 1;
  158.     if (cache_flag) {
  159.         cutOk = 1;
  160.         pcv->Maxline = pcv->Maxline_cache[pcv->depth - 1];
  161.         pcv->depth++;
  162.         dispoBits(pcv);
  163.         pcv->depth--;
  164.     } else {
  165.         dispoBits(pcv);
  166.         cutOk = processText(pcv, dialogPtr);    /* テキストの整理        */
  167.         pcv->Maxline_cache[pcv->depth - 1] = pcv->Maxline;
  168.     }
  169.  
  170.     if (pcv->pgb) {
  171.         GMBackColor(lastBC);        /* バックグラウンドカラーを元に戻す */
  172.         DMDispose(dialogPtr);        /* ダイアログを廃棄する        */
  173.         GMSetGraph(lastGraph);        /* カレントグラフを元に戻す    */
  174.     }
  175.  
  176.     CMMaxSet(pcv->volHdl, pcv->Maxline - 29);
  177.     EMDeCross();            /* マウスポインタをもとに戻す    */
  178.     if (!cutOk && pcv->cutDisp)
  179.         DMError(D_CONFIRM,
  180.         "一部あるいは全部の\rCUTファイルの読み込みに失敗しました");
  181.     return(1);
  182. }
  183.  
  184. /******************************************************************************
  185.  *    processText():    テキストの整理
  186.  ******************************************************************************
  187.  *    引数:    ComVal *pcv    共通変数へのポインタ
  188.  */
  189. int processText(ComVal *pcv, Dialog *dialogPtr)
  190. {
  191.     int i,ii,jj,j,k,tb,vw,line_end,esc,cut_lno,cutOk;
  192.     int word_count,line_count,txt_end;
  193.     int pat1,pat2;
  194.     int zen;
  195.     char cutfname[90];
  196.     char dmyfname[90];
  197.     char buff[90];
  198.     char *txtPt,*txtTop,*txtBuf;
  199.     int *txtNo;
  200.     Rect rc = { 0, 0, 588, 382};
  201.     char drv[90], path[90], node[90], ext[90];
  202.     int cur_pos = 0;
  203.     char tt[90];
  204.     char *lastPt;
  205.     int step;
  206.     char cutfname_buff[90][90];
  207.     int cutcount,cc,much;
  208.  
  209.     cutcount = 1;
  210.     for(cc=0;cc<90;cc++)
  211.         strcpy(&cutfname_buff[cc][0], "");
  212.  
  213.     MMHdlLock(pcv->txt);        /* テキストブロックのハンドルをロック */
  214.     MMHdlLock(pcv->txtNo);
  215.  
  216.     txtPt = *(pcv->txt);
  217.     txtNo = *(pcv->txtNo);
  218.     txtTop = txtPt;
  219.  
  220.     line_count = 0;
  221.     *txtNo = 0;
  222.     if (pcv->cutDisp)
  223.         cutOk = 1;
  224.     else
  225.         cutOk = 0;
  226.  
  227.     if (pcv->pgb) {
  228.         GMPenSize(LONGWORD(1,15));
  229.         GMMove(LONGWORD(30,48));
  230.         lastPt = txtPt;
  231.         step = pcv->file_size / 10;
  232.         GMForeColor(G_BLACK);
  233.     }
  234.  
  235.     while(1) {
  236.         if (pcv->pgb && (step < (txtPt - lastPt))) {
  237.             GMSetGraph(&dialogPtr->window.graph);
  238.             GMLineRel(LONGWORD(20,0));
  239.             lastPt = txtPt;
  240.         }
  241.  
  242.         j = 0;
  243.         jj = 0;
  244.         vw = 0;
  245.         *(txtNo + line_count) = txtPt - txtTop;
  246.         txt_end = 0;
  247.         zen = 1;
  248.         while(1) {
  249.             if (*txtPt == 26 || *txtPt == 0) {    /* EOF        */
  250.                 *txtPt = 0;
  251.                 txt_end = 1;
  252.                 break;
  253.             }
  254.  
  255.             if (*txtPt == 13) {            /* 改行処理    */
  256.                 txtPt++;
  257.                 break;
  258.             }
  259.  
  260.             if (*txtPt == 10) {            /* LF処理    */
  261.                 *(txtNo + line_count) = *(txtNo + line_count) + 1;
  262.                 txtPt++;
  263.                 continue;
  264.             }
  265.  
  266.             if (*txtPt == 9) {            /* TAB処理    */
  267.                 tb = 8 - (jj % 8);
  268.                 j = 0;
  269.                 jj = jj + tb;
  270.                 txtPt++;
  271.                 zen = 0;
  272.                 continue;
  273.             }
  274.  
  275.             if (*txtPt ==  27) {            /* esc文字属性    */
  276.                 if (*(txtPt+1) == '[') {
  277.                     esc = 0;
  278.                     txtPt = txtPt + 2;
  279.                     while(*txtPt != 'm') {
  280.                         txtPt++;
  281.                     }
  282.                     txtPt++;
  283.                     continue;
  284.                 }
  285.             }
  286.  
  287.             if (jj == 94) {                /* 行の折り返し    */
  288.                 if (adjust(txtPt))
  289.                     txtPt += 2;
  290.                 if (*txtPt == 13)
  291.                     txtPt++;
  292.                 break;
  293.             }
  294.             if (jj > 94) {
  295.                 break;
  296.             }
  297.  
  298.             pat1 = (int)*txtPt & 0xff;
  299.             if (iskanji(pat1)) {            /* 漢字        */
  300.                 txtPt += 2;
  301.                 jj += 2;
  302.                 continue;
  303.             }
  304.  
  305.             if (*txtPt ==  '%') {            /* %コード処理    */
  306.                 if (*(txtPt + 1) == 'V') {    /* 倍角設定    */
  307.                     vw = 1;
  308.                     txtPt = txtPt + 4;
  309.                     j = 0;
  310.                     continue;
  311.                 }
  312.                 if ((*(txtPt + 1) == 'C' && cutOk && pcv->cutNo[pcv->depth] < MAX_CUTS)) {
  313.                     if (*(txtPt + 4) == ':') {    /* カットファイル*/
  314.                         txtBuf = txtPt;
  315.                         txtPt = txtPt + 5;
  316.                         while(!(isalnmkana((int)*txtPt)) && *txtPt != '\\') {
  317.                             txtPt++;
  318.                         }
  319.                         for(i=0;i<90;i++) {
  320.                             if (*txtPt == '.')
  321.                                 break;
  322.                             dmyfname[i] = *txtPt++;
  323.                         }
  324.                         for(ii=i;ii<i+4;ii++) {
  325.                             dmyfname[ii] = *txtPt++;
  326.                         }
  327.                             dmyfname[ii] = 0;
  328.  
  329.                         if (*dmyfname == '\\') {
  330.                             if (!strncmp(pcv->currentFname,pcv->a_drv, strlen(pcv->a_drv)))
  331.                                 sprintf(buff, "A:%s", dmyfname);
  332.                             else
  333.                                 sprintf(buff, "B:%s", dmyfname);
  334.             
  335.                             structfname(pcv, "", buff, cutfname);
  336.                         } else {
  337.                             strsfn(pcv->currentFname, drv, path, node, ext);
  338.                             sprintf(cutfname, "%s%s\\%s", drv, path,dmyfname);
  339.                         }
  340.  
  341.                         much = 0;
  342.                         if (cutcount > 1) {
  343.                             for(cc=1;cc<cutcount;cc++) {
  344.                                 if (!strcmp(cutfname,&cutfname_buff[cc][0])) {
  345.                                     much = 1;
  346.                                     break;
  347.                                 }
  348.                             }
  349.                         }
  350.                          if (much > 0) {
  351.                             cut_lno = '0';
  352.                             *(txtBuf+2) = '0'+(char)cc;
  353.                             *(txtBuf+3) = cut_lno;
  354.                             cutOk = 1;
  355.                             continue;
  356.                         } else {
  357.                             if (!cut(pcv, cutfname)) {
  358.                                 cutOk = 0;
  359.                             } else {
  360.                                 cut_lno = '0';
  361.                                 *(txtBuf+2) = '0'+(char)cutcount;
  362.                                 *(txtBuf+3) = cut_lno;
  363.                                 cc = cutcount;
  364.                                 strcpy(&cutfname_buff[cutcount++][0], cutfname); 
  365.                                 cutOk = 1;
  366.                                 continue;
  367.                             }
  368.                         }
  369.                     } else if (cutOk) {
  370.                         *(txtPt+2) = '0' + (char)cc;
  371.                         *(txtPt+3) = ++cut_lno;
  372.                     }
  373.                 }
  374.             }
  375.  
  376.             if (*txtPt ==  24) {            /* 倍角解除    */
  377.                 if (vw == 1) {
  378.                     vw = 0;
  379.                     j = 0;
  380.                     continue;
  381.                 }
  382.                 txtPt++;
  383.                 continue;
  384.             }
  385.  
  386.             txtPt++;
  387.             jj++;
  388.         }
  389.  
  390.         if (txt_end) break;
  391.         if ((txtPt - txtTop + 1) >= pcv->file_size) break;
  392.         line_count++;
  393.     }
  394.     if (pcv->pgb) {
  395.         GMSetGraph(&dialogPtr->window.graph);
  396.         GMLine(LONGWORD(230,48));
  397.     }
  398.  
  399.     pcv->Maxline = line_count;
  400.     if (pcv->normal)
  401.         pcv->ofset = 0;
  402.     else
  403.         pcv->normal = 1;
  404.     MMHdlUnlock(pcv->txtNo); /* テキストブロックのハンドルをアンロック */
  405.     MMHdlUnlock(pcv->txt);
  406.     return(cutOk);
  407. }
  408.  
  409. /******************************************************************************
  410.  *    setWinOpt():    ウィンドウ設定
  411.  ******************************************************************************
  412.  *    引数:    ComVal *pcv    共通変数へのポインタ
  413.  */
  414. void setWinOpt(ComVal *pcv, int fileLen)
  415. {
  416.     LASCII wTitle;
  417.     char name[90],node[90],ext[5];
  418.     Task mytask;
  419.     size_t len;
  420.     char *txtPt,*ttPt,*tePt,*tt2Pt;
  421.     int i, flag1 = 1, flag2 = 1;
  422.  
  423.     strcpy(name, pcv->currentFname);
  424.     stcgfn(node, name);
  425.     if (strcmp(node, "MOKUJI") == 0) {
  426.         MMHdlLock(pcv->txt);
  427.         txtPt = *(pcv->txt);
  428.         ttPt = NULL;
  429.         tt2Pt = NULL;
  430.         for (i=0;i<fileLen - 10;i++) {
  431.             txtPt++;
  432.  
  433.             if (flag1 && !strncmp(txtPt,"\r\n電脳倶楽部 ", 14)) {
  434.                 ttPt = txtPt + 2;
  435.                 flag1 = 0;
  436.             }
  437.             if (flag2 && !strncmp(txtPt,"・自由軟盤", 10)) {
  438.                 tt2Pt = txtPt + 2;
  439.                 flag2 = 0;
  440.             }
  441.             if (!flag1 && !flag2)
  442.                 break;
  443.         }
  444.         MMHdlUnlock(pcv->txt);
  445.         if (!flag1) {
  446.             tePt = strstr(ttPt, "(");
  447.             strncpy(pcv->title, ttPt, tePt - ttPt);
  448.             pcv->title[tePt - ttPt] = 0;
  449.         } else if (!flag2) {
  450.             tePt = strstr(tt2Pt, "(");
  451.             strncpy(pcv->title, tt2Pt, tePt - tt2Pt);
  452.             pcv->title[tePt - tt2Pt] = 0;
  453.         } else {
  454.             strcpy(pcv->title, "電脳倶楽部");
  455.         }
  456.     }
  457.  
  458.     len = strlen(pcv->currentFname);
  459.  
  460.     /* ファイル名の変更があったのでタスク管理レコードに設定
  461.        (タスク起動チェックに必要)*/
  462.     TSGetTdb(&mytask, TS_OWN);
  463.     mytask.command[0] = len;
  464.     strncpy((char *) &mytask.command[1], pcv->currentFname, len);
  465.     TSSetTdb(&mytask, TS_OWN);
  466.  
  467.     stcgfn(name, pcv->currentFname);
  468.     stcgfe(ext, pcv->currentFname);
  469.     wTitle[0] = sprintf((char *) &wTitle[1], "%s [%s.%s]",pcv->title,name,ext);
  470.     WMTitleSet(pcv->windowPtr, wTitle);
  471. }
  472.  
  473. /******************************************************************************
  474.  *    chkdrv():    ドライブパス設定
  475.  ******************************************************************************
  476.  *    引数:    ComVal *pcv    共通変数へのポインタ
  477.  */
  478. void chkdrv(ComVal *pcv)
  479. {
  480.     char name[256], node[256], try_a[236], drv[90], path[90], ext[5];
  481.     int i, pat = 0;
  482.     LASCII wTitle;
  483.     Task mytask;
  484.     size_t len;
  485.  
  486.     strcpy(name, pcv->currentFname);
  487.     strsfn(name, drv, path, node, ext);
  488.  
  489.     if (!strncmp(ext, "DCV", 3)) {
  490.         strcpy(pcv->title, "DC_VIEW");
  491.         len = strlen(pcv->currentFname);
  492.         TSGetTdb(&mytask, TS_OWN);
  493.         mytask.command[0] = len;
  494.         strncpy((char *) &mytask.command[1], pcv->currentFname, len);
  495.         TSSetTdb(&mytask, TS_OWN);
  496.  
  497.         wTitle[0] = sprintf((char *) &wTitle[1], "%s [%s.%s]",pcv->title,name,ext);
  498.         WMTitleSet(pcv->windowPtr, wTitle);
  499.         return;
  500.     }
  501.  
  502.     if (strncmp(node, "MOKUJI", 6))
  503.         return;
  504.  
  505.     pcv->mloadFlag = 0;
  506.  
  507.     stoupper(name);
  508.     for(i=0;i<strlen(name);i++) {
  509.         if (!strncmp(&name[i], "QS", 2) ||
  510.             !strncmp(&name[i], "QUICKSTART", 2)) {
  511.             pat = 1;
  512.             break;
  513.         }
  514.     }
  515.     if (!pat) {
  516.         for(i=0;i<strlen(name);i++) {
  517.             if (!strncmp(&name[i], "\\M", 2)) {
  518.                 i++;
  519.                 pat = 1;
  520.                 break;
  521.             }
  522.         }
  523.     }
  524.     if (!pat)
  525.         return;
  526.  
  527.     strsfn(pcv->currentFname, drv, path, node, ext); /* カレントパス設定 */
  528.     sprintf(pcv->currentPath, "%s%s\\", drv, path);
  529.  
  530.     strncpy(try_a, name, i - 1);     /* 仮想A:ドライブパス設定    */
  531.     try_a[i-1] = 0;
  532.     strcpy(pcv->a_drv, try_a);
  533.  
  534.     if (pcv->set_as_a) {
  535.         strcpy(pcv->b_drv, pcv->a_drv);
  536.         strcpy(pcv->c_drv, pcv->a_drv);
  537.         return;
  538.     }
  539.  
  540.  
  541.     if (try_a[2] != '\\') {        /* 仮想B:ドライブパス設定    */
  542.         try_a[0] = try_a[0] + 1;
  543.         strcpy(pcv->c_drv, try_a);
  544.         try_a[0] = try_a[0] + 1;
  545.         strcpy(pcv->c_drv, try_a);
  546.         return;
  547.     }
  548.  
  549.     if (try_a[i-2] == '1') {
  550.         try_a[i-2] = '2';
  551.     } else if ((try_a[i-2] == 'a') || (try_a[i-2] == 'A')) {
  552.         try_a[i-2] = 'B';
  553.     } else {
  554.         return;
  555.     }
  556.     strcpy(pcv->b_drv, try_a);
  557.  
  558.     if (try_a[i-2] == '2') {    /* 仮想C:ドライブパス設定    */
  559.         try_a[i-2] = '3';
  560.     } else if ((try_a[i-2] == 'b') || (try_a[i-2] == 'B')) {
  561.         try_a[i-2] = 'C';
  562.     } else {
  563.         return;
  564.     }
  565.     strcpy(pcv->c_drv, try_a);
  566. }
  567.  
  568. /******************************************************************************
  569.  *    stoupper():    strupr
  570.  ******************************************************************************
  571.  *    引数:    ComVal *pcv    共通変数へのポインタ
  572.  */
  573. char *stoupper(char *txt)
  574. {
  575.     int i,len,str;
  576.     char *buff;
  577.  
  578.     len = strlen(txt);
  579.     buff = txt;
  580.     for(i=0;i<len;i++) {
  581.         str = ((int)*txt << 8) + (int)*(txt + 1);
  582.         if(jiszen(str)) {
  583.             txt += 2;
  584.             i++;
  585.             continue;
  586.         }
  587.         if(islower(*txt))
  588.             *txt = (char)toupper(*txt);
  589.         txt++;
  590.     }
  591.     return(buff);
  592. }
  593. STR@8EdEV3.00<@(!%G0JHH     
  594. ;7\7
  595. 6W^コマ Z@ "    (.Ohh$000ヨ=STL@QL